文件是数据的抽象和集合
文件处理的步骤:打开-操作-关闭
文件操作的全过程:python解释器–>system api–>system call–>虚拟文件系统–>设备驱动–>硬件设备
打开文件
open(file, mode=’r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
1 | f = open(filename, mode, encoding) # open()函数打开文件,文件处于占用状态,变量f是文件句柄 |
1 | # 推荐使用这种方法 |
file:文件路径和名称,源文件同目录可省路径
mode:文本 or 二进制,读 or 写 or 追加 or 组合
文本方式和二进制方式是文件的两种不同展示方式
文本方式采用统一的编码解释文件
二进制方式采用字节解释文件
| mode | 含义 |
| —- | ——————————————————- |
| ‘r’ | 只读模式,默认值,如果文件不存在,返回FileNotFoundError |
| ‘w’ | 覆盖写模式,文件不存在则创建,存在则完全覆盖 |
| ‘x’ | 创建写模式,文件不存在则创建,存在则返回FileExistsError |
| ‘a’ | 追加写模式,文件不存在则创建,存在则在文件最后追加内容 |
| ‘b’ | 二进制文件模式 |
| ‘t’ | 文本文件模式,默认值 |
| ‘+’ | 与r/w/x/a一同使用,在原功能基础上增加同时读写功能 |
- encoding:指定打开文件时采用的编码方式
读取文件
方法 | 描述 |
---|---|
f.read(size=-1) | 读入全部内容,如果给出参数,读入前size长度 |
f.readline(size=-1) | 读入一行内容,如果给出参数,读入该行前size长度 |
f.readlines(hint=-1) | 读入文件所有行,以每行为元素形成列表。如果给出参数,读入前hint个字符所在行的所有字符,然后把这些字符按行拆分成列表。 |
1 | # 搞不清楚file.readlines(hint)的参数hint啥意思,写个脚本测试下。 |
1 | #------小文件处理------------- |
写入文件
方法 | 描述 |
---|---|
f.write(s) | 向文件写入一个字符串或字节流 |
f.writelines(lines) | 将一个元素全为字符串的可迭代对象写入文件 |
写缓存机制:不调用close()、flush()或者缓冲区未满,不会将缓冲区数据写入磁盘
文件指针
直接读写的痛点
- 写入文件后,必须打开才能读取写入的内容
- 读取文件后,无法重新再次读取读过的内容
查看当前文件指针的位置
f.tell()
返回一个整数
改变指针位置
f.seek(offset, whence=0)
offset是相对whence的偏移量,可正可负可0
whence | 含义 |
---|---|
0 | 文件开头 |
1 | 当前位置 |
2 | 文件结尾 |
1 | fo = open("output.txt","w+") |
关闭文件
f.close()
为什么要关闭文件?
将写缓存同步到磁盘
Linux每个进程打开的文件个数是有限的
文件对象的属性和方法
| buffer
|
| closed
|
| encoding
| Encoding of the text stream.
|
| Subclasses should override.
|
| errors
| The error setting of the decoder or encoder.
|
| Subclasses should override.
|
| line_buffering
|
| name
|
| newlines
| Line endings translated so far.
|
| Only line endings translated during reading are considered.
|
| Subclasses should override.
|
| write_through
fileno(self, /)
| Returns underlying file descriptor if one exists.
|
| OSError is raised if the IO object does not use a file descriptor.
标准文件
- 标准输入:sys.stdin
- 标准输出:sys.stdout
- 标准错误:sys.stderr
- 命令行参数:sys.argv